[レポート] Optimizing performance for .NET on AWS Lambda #reinvent #XNT403

[レポート] Optimizing performance for .NET on AWS Lambda #reinvent #XNT403

Clock Icon2022.12.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

YouTube で公開されている AWS re:Invent 2022 Breakout Session の Optimizing performance for .NET on AWS Lambda XNT403 のセッションレポートです。

このセッションでは .NET Lambda のコールドスタート対策に .NET 7 の Native AOT 機能を使うアプローチが紹介されています。

セッション概要

Are your .NET serverless applications tuned for performance? This session covers a variety of techniques you can use to optimize the performance of your code to help save development time, reduce costs, and improve the responsiveness of your applications. Discover a range of techniques, including code optimization, provisioned concurrency, and using new .NET features such as native AOT.

スピーカー

  • Saikat Banerjee, Software Development Manager, Amazon Web Services
  • Beau Gosse, Senior SDE, Amazon

レベル

400 - Expert

セッション内容

前半に少し座学があり、大部分は実際に Native AOT を有効化したり速度の比較をしたりといったデモ中心のセッションでした。

Lambda コールドスタートが発生する仕組み

Lambda のライフサイクルの初期化処理。
特に .NET と Java はコールドスタートで非常に時間がかかる。

.NET と JIT コンパイラー

以下の例であればコールドスタート時には 2 秒の初期化処理が発生する。

実際には JIT コンパイラーのいくつかのオペレーションによって更に追加の遅延が発生する。

Native AOT

.NET は通常 JIT コンパイラーによって IL コードがネイティブコードにコンパイルされる仕組みになっている。
.NET 7 で JIT ではなくて AOT (事前コンパイル) を行う Native AOT の仕組みが導入されている。
Lambda でこれを使うとコールドスタートの時間が 20~70% 削減出来たという話。

Native AOT を使った場合のコールドスタート速度の比較デモ

Native AOT 有効化

プロジェクトプロパティで Native AOT を有効化している。
デバッグシンボルなどいくつか考慮点はあるが基本はプロジェクトプロパティの設定だけ。

また、SAM CLI のブループリントでも Native AOT のものが提供されている点について言及されている。

コールドスタートあり

コールドスタートありの場合、JIT だと 6114 ms、AOT だと 1638 ms と大きな速度の違いが確認された。
かなり違う。

コールドスタートなし

コールドスタートなしの場合、JIT だと 241 ms、AOT だと 216 ms という結果となった。
後述のパフォーマンスまとめで言及されているがウォームスタート時も Native AOT の影響で少しだけ早くなってるらしい。

パフォーマンスまとめ

この図は .NET バージョンごとのコールドスタートの速度比較。
.NET 6 で .NET 3.1 よりも少し改善されていた。
.NET 7 の Native AOT を採用すると圧倒的に改善されるという話。

また、Native AOT には他にもメリットあるという点も言及されている。

まとめ

Native AOT によって Lambda コールドスタートが大幅に短縮されることが確認出来るセッションでした。
初期化コストを改善するという点は Java で登場した SnapStart と同じアプローチですね。
.NET の場合はネイティブの機能で提供されているので使ってみましょうという話でした。

ただし「Native AOT だと X-Ray が動かない」みたいな情報も re:Post で見たので、どこまで互換性があるかはきちんと評価が必要そうだなと思ってます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.